package com.jiazhong.内部类.静态内部类;
//实质：静态成员
/**
 * 说明：静态内部类是定义在外部类的成员位置，并且有Static修饰
 * 1.可以直接访问外部类的所有静态成员，包含私有的，但是不能访问非静态成员
 */
public class StaticInnerClass {
    public static void main(String[] args) {
        Outer10 outer10=new Outer10();
        outer10.m1();
        //8.外部其他类怎么来访问静态内部类
        //方式1
        //因为是静态内部类，是可以通过类名直接访问(前提是满足访问权限)
        Outer10.Inner10 inner10=new Outer10.Inner10();
        inner10.say();
        //方式2
        //编写一个方法，可以返回静态内部类的对象实例
        Outer10.Inner10 inner11=new Outer10.Inner10();
        inner11.say();
        //方式3
        Outer10.Inner10 inner101=Outer10.getInner10_();
        inner101.say();
    }
}
class Outer10{//外部类
    private int n1=10;
    private static String name="张三";
    //6.静态内部类---访问----外部类(静态属性)访问方式，直接访问所有的静态成员
    private static void cry(){}
    //静态内部类
    //1.放在外部类的成员位置
    //2.使用static修饰
    //4.可以添加任意访问修饰符(4中)，因为他的地位就是一个成员
    //5.作用域：同其他的成员，为整个类体

    protected static class Inner10{
        private static String name="加中实训";
        //3.可以直接访问外部类的所有静态成员，包含私有的，但是不能直接访问非静态成员
        void say(){
            System.out.println(name);
            //9.如果外部类和内部类的成员重名的时候，静态内部类访问的话，默认遵循就近原则，
            // 如果想要访问外部类的成员，则可以使用（外部类名.成员）去访问
            System.out.println("外部类名 name="+Outer10.name);

        }
    }
    //7.外部类---访问---内部类，访问方式 创建对象 在访问
    public void m1(){
        Inner10 inner10=new Inner10();
        inner10.say();
    }
    //方式2
    public Inner10 getInner10(){//不用static修饰调用不了
        return new Inner10();
    }
    //在写一个静态的
    public static Inner10 getInner10_(){
        return new Inner10();
    }
}
/*
小结：
1.内部类有四种，局部内部类，匿名内部类，成员内部类，静态内部类
2.重点 匿名内部类
new 类/接口(参数列表){
    //。。。
}
3.成员和静态都在成员位置上，本质就是一个成员
 */